home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / Book Chapters / 13 - PowerPC / Optimize 3 / Blitter.c next >
Text File  |  1995-03-07  |  4KB  |  175 lines

  1. /*********************/
  2. /*     BLITTER.C     */
  3. /*********************/
  4. //
  5. // This file contains the "poor man's profiler" and
  6. // the screen blitter routine.
  7. //
  8.  
  9. /****************************/
  10. /*    EXTERNALS             */
  11. /****************************/
  12.  
  13. extern    Ptr            gScreenAddr,gDrawBufferPtr;
  14. extern    long        gScreenRowBytes;
  15.  
  16.  
  17. /****************************/
  18. /*    PROTOTYPES            */
  19. /****************************/
  20.  
  21. void ProfileIt(void);
  22. static void BlitBufferToScreen(void);
  23.  
  24.  
  25. /****************************/
  26. /*    CONSTANTS             */
  27. /****************************/
  28.  
  29.  
  30. /****************************/
  31. /*    VARIABLES             */
  32. /****************************/
  33.  
  34.  
  35.  
  36. /********************* PROFILE IT *********************/
  37. //
  38. // Calls the blitter routine 1000 times and does a
  39. // beep at the beginning and end so you can time in
  40. // on a stopwatch.
  41. //
  42.  
  43. void ProfileIt(void)
  44. {
  45. long    i;
  46.  
  47.     SysBeep(0);                                    // MAKE 1ST BEEP SOUND
  48.     
  49.     for (i=0; i < 1000L; i++)                    // blit the buffer 1000 times
  50.         BlitBufferToScreen();
  51.         
  52.     SysBeep(0);                                    // MAKE 2ND BEEP SOUND    
  53. }
  54.  
  55.  
  56. /*************** BLIT BUFFER TO SCREEN ****************/
  57. //
  58. // This is a partially optimized blitter routine which
  59. // will blit the 640x480 buffer to the screen.
  60. //
  61. // This has been optimized by using doubles to copy 8 bytes
  62. // of data at a time.
  63. //
  64. // On a PowerMac 6100/60 it takes approximately 14 seconds
  65. // to execute this 1000 times.
  66. //
  67.  
  68. static void BlitBufferToScreen(void)
  69. {
  70. long    y,rowBytes;
  71. double    *destPtr,*srcPtr;
  72.  
  73.     srcPtr = (double *)gDrawBufferPtr;            // get ptr to start of buffer
  74.     destPtr = (double *)gScreenAddr;            // get ptr to start of scan line
  75.  
  76.      rowBytes = gScreenRowBytes/8;                // calc rowBytes in terms of doubles
  77.  
  78.     for(y=480; y ; y--)
  79.     {
  80.         destPtr[0] = srcPtr[0];
  81.         destPtr[1] = srcPtr[1];
  82.         destPtr[2] = srcPtr[2];
  83.         destPtr[3] = srcPtr[3];
  84.         destPtr[4] = srcPtr[4];
  85.         destPtr[5] = srcPtr[5];
  86.         destPtr[6] = srcPtr[6];
  87.         destPtr[7] = srcPtr[7];
  88.         destPtr[8] = srcPtr[8];
  89.         destPtr[9] = srcPtr[9];
  90.  
  91.         destPtr[10] = srcPtr[10];
  92.         destPtr[11] = srcPtr[11];
  93.         destPtr[12] = srcPtr[12];
  94.         destPtr[13] = srcPtr[13];
  95.         destPtr[14] = srcPtr[14];
  96.         destPtr[15] = srcPtr[15];
  97.         destPtr[16] = srcPtr[16];
  98.         destPtr[17] = srcPtr[17];
  99.         destPtr[18] = srcPtr[18];
  100.         destPtr[19] = srcPtr[19];
  101.  
  102.         destPtr[20] = srcPtr[20];
  103.         destPtr[21] = srcPtr[21];
  104.         destPtr[22] = srcPtr[22];
  105.         destPtr[23] = srcPtr[23];
  106.         destPtr[24] = srcPtr[24];
  107.         destPtr[25] = srcPtr[25];
  108.         destPtr[26] = srcPtr[26];
  109.         destPtr[27] = srcPtr[27];
  110.         destPtr[28] = srcPtr[28];
  111.         destPtr[29] = srcPtr[29];
  112.  
  113.         destPtr[30] = srcPtr[30];
  114.         destPtr[31] = srcPtr[31];
  115.         destPtr[32] = srcPtr[32];
  116.         destPtr[33] = srcPtr[33];
  117.         destPtr[34] = srcPtr[34];
  118.         destPtr[35] = srcPtr[35];
  119.         destPtr[36] = srcPtr[36];
  120.         destPtr[37] = srcPtr[37];
  121.         destPtr[38] = srcPtr[38];
  122.         destPtr[39] = srcPtr[39];
  123.  
  124.         destPtr[40] = srcPtr[40];
  125.         destPtr[41] = srcPtr[41];
  126.         destPtr[42] = srcPtr[42];
  127.         destPtr[43] = srcPtr[43];
  128.         destPtr[44] = srcPtr[44];
  129.         destPtr[45] = srcPtr[45];
  130.         destPtr[46] = srcPtr[46];
  131.         destPtr[47] = srcPtr[47];
  132.         destPtr[48] = srcPtr[48];
  133.         destPtr[49] = srcPtr[49];
  134.  
  135.         destPtr[50] = srcPtr[50];
  136.         destPtr[51] = srcPtr[51];
  137.         destPtr[52] = srcPtr[52];
  138.         destPtr[53] = srcPtr[53];
  139.         destPtr[54] = srcPtr[54];
  140.         destPtr[55] = srcPtr[55];
  141.         destPtr[56] = srcPtr[56];
  142.         destPtr[57] = srcPtr[57];
  143.         destPtr[58] = srcPtr[58];
  144.         destPtr[59] = srcPtr[59];
  145.  
  146.         destPtr[60] = srcPtr[60];
  147.         destPtr[61] = srcPtr[61];
  148.         destPtr[62] = srcPtr[62];
  149.         destPtr[63] = srcPtr[63];
  150.         destPtr[64] = srcPtr[64];
  151.         destPtr[65] = srcPtr[65];
  152.         destPtr[66] = srcPtr[66];
  153.         destPtr[67] = srcPtr[67];
  154.         destPtr[68] = srcPtr[68];
  155.         destPtr[69] = srcPtr[69];
  156.  
  157.         destPtr[70] = srcPtr[70];
  158.         destPtr[71] = srcPtr[71];
  159.         destPtr[72] = srcPtr[72];
  160.         destPtr[73] = srcPtr[73];
  161.         destPtr[74] = srcPtr[74];
  162.         destPtr[75] = srcPtr[75];
  163.         destPtr[76] = srcPtr[76];
  164.         destPtr[77] = srcPtr[77];
  165.         destPtr[78] = srcPtr[78];
  166.         destPtr[79] = srcPtr[79];
  167.  
  168.         destPtr += rowBytes;                // skip to next scan line
  169.         srcPtr += 80;
  170.     }
  171. }
  172.  
  173.  
  174.  
  175.